home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Chans / fax / ps250 / ps250_stat.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  7.7 KB  |  402 lines

  1. /* ps250_stat.c: routines to enquiry of PS 250s status */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Chans/fax/ps250/RCS/ps250_stat.c,v 6.0 1991/12/18 20:07:26 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Chans/fax/ps250/RCS/ps250_stat.c,v 6.0 1991/12/18 20:07:26 jpo Rel $
  9.  *
  10.  * $Log: ps250_stat.c,v $
  11.  * Revision 6.0  1991/12/18  20:07:26  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16. #include    "util.h"
  17. #include     "ps250.h"
  18.  
  19. extern void advise (), adios ();
  20.  
  21. char    *get_job_str(), *get_com_str();
  22.  
  23. int fax_getstat1 (fd, sp)
  24. int    fd;
  25. Stat1 *sp;
  26. {
  27.     Faxcomm fc;
  28.  
  29.     if (fax_readpacket (fd, &fc) == NOTOK)
  30.         return NOTOK;
  31.     if (fc.command != RESP_STAT1)
  32.         return NOTOK;
  33.     return fax_fc2stat1 (&fc, sp);
  34. }
  35.  
  36. fax_fc2data (fp, dp)
  37. Faxcomm    *fp;
  38. Data    *dp;
  39. {
  40.     char    *cp;
  41.  
  42.     bzero ((char *)dp, sizeof *dp);
  43.     cp = fp -> data;
  44.     
  45.     dp->pageEnd = (*cp) & DATA_PAGE_END;
  46.     dp->docEnd = (*cp) & DATA_DOC_END;
  47.     
  48.     cp++;
  49.     dp->datalen = fp -> len - 1;
  50.     bcopy(cp, dp->data, dp->datalen);
  51. }
  52.  
  53. fax_fc2stat1 (fp, sp)
  54. Faxcomm *fp;
  55. Stat1 *sp;
  56. {
  57.     char    *cp;
  58.     
  59.     cp = fp -> data;
  60.     bzero ((char *)sp, sizeof *sp);
  61.     sp -> ce_code = *cp++;
  62.     sp -> mode_cmd = *cp++;
  63.     sp -> ring_in = *cp++;
  64.     sp -> scan_stat = *cp++;
  65.     sp -> print_stat = *cp ++;
  66.     sp -> job_info = *cp ++;
  67.     if (*cp) {
  68.         bcopy (cp, sp -> fecode, 4);
  69.         cp += 4;
  70.     }
  71.     else cp ++;
  72.  
  73.     sp -> res = *cp ++;
  74.     sp -> comm = *cp ++;
  75.     if (*cp == 0) {
  76.         sp -> remid[0] = 0;
  77.         cp ++;
  78.     }
  79.     else {
  80.         bcopy (cp, sp -> remid, 21);
  81.         cp += 21;
  82.     }
  83.  
  84.     sp -> errlines = *cp << 8 | cp[1];
  85.     cp += 2;
  86.     sp -> page_no = atoi (cp);
  87.     cp += 3;
  88.     if (cp - fp -> data != fp -> len)
  89.         advise (NULLCP, "Packet length mismatch %d != %d",
  90.             cp - fp -> data, fp -> len);
  91.     return OK;
  92. }
  93.  
  94. void fax_pstat1(sp)
  95. Stat1    *sp;
  96. {
  97.     if (sp -> ce_code != COMERR_OK) 
  98.         PP_LOG(LLOG_DEBUG,
  99.                ("=>Command Code: %s\n",
  100.             get_com_str(sp->ce_code)))
  101.     switch (sp -> mode_cmd & MODE_MASK) {
  102.         case MODE_WAIT_JOB:
  103.         PP_LOG(LLOG_DEBUG,
  104.                ("Mode : Wait Job"));
  105.         break;
  106.         case MODE_WAIT_BLOCK:
  107.         PP_LOG(LLOG_DEBUG,
  108.                ("Mode : Wait Block"));
  109.         break;
  110.         case MODE_FAX_WORKING:
  111.         PP_LOG(LLOG_DEBUG,
  112.                ("Mode : Fax working"));
  113.         break;
  114.         default:
  115.         PP_LOG(LLOG_DEBUG,
  116.                ("Unknown Mode : 0x%x", sp -> mode_cmd & MODE_MASK));
  117.         break;
  118.     }
  119.     putchar ('\n');
  120.  
  121.     if (sp -> ring_in == RING_IN)
  122.         PP_LOG(LLOG_DEBUG,
  123.                ("Ring in set"));
  124.  
  125.     if (sp -> scan_stat & SCAN_DOC_SCAN)
  126.         PP_LOG(LLOG_DEBUG,
  127.                ("Scanner Status: Document scanner"));
  128.     if (sp -> scan_stat & SCAN_NODOC)
  129.         PP_LOG(LLOG_DEBUG,
  130.                ("Scanner Status: No document on ADF"));
  131.     if (sp -> scan_stat & SCAN_FEEDERR)
  132.         PP_LOG(LLOG_DEBUG,
  133.                ("Scanner Status: Feeder Error"));
  134.     if (sp -> scan_stat & SCAN_TOOLONG)
  135.         PP_LOG(LLOG_DEBUG,
  136.                ("Scanner Status: Document too long"));
  137.     if (sp -> scan_stat & SCAN_B4)
  138.         PP_LOG(LLOG_DEBUG,
  139.                ("Scanner Status: Document B4 size"));
  140.  
  141.     if (sp -> print_stat & PRINT_PJAM)
  142.         PP_LOG(LLOG_DEBUG,
  143.                ("Printer Status: Printer Jam"));
  144.     if (sp -> print_stat & PRINT_NOPAPER)
  145.         PP_LOG(LLOG_DEBUG,
  146.                ("Printer Status: No paper"));
  147.  
  148.     PP_LOG(LLOG_DEBUG,
  149.            ("Job Info: %s", get_job_str(sp->job_info)));
  150.  
  151.     if (sp -> fecode[0]) 
  152.         PP_LOG(LLOG_EXCEPTIONS,
  153.                ("Fax error code: %s", 
  154.             faxerr2str(atoi(sp -> fecode))));
  155.  
  156.     if (sp -> res !=0) {
  157.         switch (sp -> res & RES_MASK) {
  158.             case RES_7_7:
  159.             PP_LOG(LLOG_DEBUG,
  160.                    ("Resolution: 7.7 lines/mm"));
  161.             break;
  162.             case RES_3_85:
  163.             PP_LOG(LLOG_DEBUG,
  164.                    ("Resolution: 3.85 lines/mm"));
  165.             break;
  166.             case RES_15_4:
  167.             PP_LOG(LLOG_DEBUG,
  168.                    ("Resolution: 15.4 lines/mm"));
  169.             break;
  170.             default:
  171.             PP_LOG(LLOG_DEBUG,
  172.                    ("Resolution: Unknown (0x%x)", sp -> res));
  173.             break;
  174.         }
  175.     } else
  176.         PP_LOG(LLOG_DEBUG,
  177.                ("Resolution: unset"));
  178.  
  179.     if (sp -> comm != 0) {
  180.         char    buf[BUFSIZ];
  181.         switch (sp -> comm & COMM_GMASK) {
  182.             case COMM_G2:
  183.             strcpy(buf," G2");
  184.             break;
  185.             case COMM_G3:
  186.             strcpy(buf, " G3");
  187.             break;
  188.             default:
  189.             sprintf (buf, " %d", sp -> comm);
  190.             break;
  191.         }
  192.         switch (sp -> comm & COMM_XR_MASK) {
  193.             case COMM_XMT:
  194.             strcat (buf, " XMT");
  195.             break;
  196.             case COMM_RCV:
  197.             strcat (buf, " RCV");
  198.             break;
  199.             default:
  200.             break;
  201.         }
  202.  
  203.         switch (sp -> comm & COMM_SPEED_MASK) {
  204.             case COMM_SPEED_2400:
  205.             strcat (buf, " 2400baud");
  206.             break;
  207.             case COMM_SPEED_4800:
  208.             strcat (buf, " 4800 baud");
  209.             break;
  210.             case COMM_SPEED_7200:
  211.             strcat (buf, " 7200baud");
  212.             break;
  213.             case COMM_SPEED_9600:
  214.             strcat (buf, " 9600baud");
  215.             break;
  216.             default:
  217.             break;
  218.         }
  219.  
  220.         switch (sp -> comm & COMM_MHR_MASK) {
  221.             case COMM_MH:
  222.             strcat (buf, " MH");
  223.             break;
  224.             case COMM_MR:
  225.             strcat (buf, " MR");
  226.             break;
  227.         }
  228.         if ((sp -> comm &  COMM_POLLED) == COMM_POLLED)
  229.             strcat (buf, " Polled");
  230.         PP_LOG(LLOG_DEBUG,
  231.                ("Comms: %s",buf));
  232.     } else
  233.         PP_LOG(LLOG_DEBUG,
  234.                ("Comms: unset"));
  235.  
  236.     if (sp -> remid[0]) 
  237.         PP_LOG(LLOG_DEBUG,
  238.                ("Remote Id: %s", sp -> remid));
  239.  
  240.     if (sp -> errlines) 
  241.         PP_LOG(LLOG_EXCEPTIONS,
  242.                (" Error Lines: %d", sp -> errlines));
  243.  
  244.     if (sp -> page_no) 
  245.         PP_LOG(LLOG_DEBUG,
  246.                ("Page No: %d", sp->page_no));
  247. }
  248.  
  249. static char    ret[128];
  250.  
  251. char    *get_com_str(com)
  252. int    com;
  253. {
  254.     switch (com) {
  255.         case COMERR_UNDEF_COMMAND:
  256.         sprintf (ret, "Undefined Command");
  257.         break;
  258.         case COMERR_UNAC_COMMAND:
  259.         sprintf (ret, "Unacceptable Command");
  260.         break;
  261.         case COMERR_PARAM:
  262.         sprintf (ret, "Command Parameter Error");
  263.         break;
  264.         case COMERR_FRAME:
  265.         sprintf (ret, "Frame Error");
  266.         default:
  267.         sprintf (ret, "Unknown response code 0x%x", com);
  268.         break;
  269.     }
  270.     return ret;
  271. }
  272.  
  273. char    *get_job_str(job)
  274. int    job;
  275. {
  276.     switch (get_job_info (job)) {
  277.         case JOB_IN:
  278.         sprintf (ret, "Job In");
  279.         break;
  280.         case JOB_READY:
  281.         sprintf (ret, "Job ready");
  282.         break;
  283.         case JOB_DATA_AVAIL:
  284.         sprintf (ret, "Job data avilable");
  285.         break;
  286.         case JOB_RETRANS:
  287.         sprintf (ret, "Job retransmit last block");
  288.         break;
  289.         case JOB_NORM_END:
  290.         sprintf (ret, "Normal end");
  291.         break;
  292.         case JOB_FAULT_JOB_END:
  293.         sprintf (ret, "Fault job end");
  294.         break;
  295.         case JOB_LINE_DISC:
  296.         sprintf (ret, "Line disconnected");
  297.         break;
  298.         default:
  299.         sprintf (ret, "Unknown value %o", job);
  300.         break;
  301.     }
  302.     return ret;
  303. }    
  304.  
  305. int     get_job_info(job)
  306. int    job;
  307. {
  308.     if ((job & JOB_READY) == JOB_READY)
  309.         return JOB_READY;
  310.     if ((job & JOB_DATA_AVAIL) == JOB_DATA_AVAIL)
  311.         return JOB_DATA_AVAIL;
  312.     if ((job & JOB_RETRANS) == JOB_RETRANS)
  313.         return JOB_RETRANS;
  314.     if ((job & JOB_NORM_END_MASK) == JOB_NORM_END)
  315.         return JOB_NORM_END;
  316.     if ((job & JOB_NORM_END_MASK) == JOB_FAULT_JOB_END)
  317.         return JOB_FAULT_JOB_END;
  318.     if ((job & JOB_LINE_DISC_MASK) == JOB_LINE_DISC)
  319.         return JOB_LINE_DISC;
  320.     if ((job & JOB_IN))
  321.         return JOB_IN;
  322.     return NOTOK;
  323. }
  324.  
  325. void    timet2fax (t, buf)
  326. time_t    t;
  327. char    buf[];
  328. {
  329.     struct tm *tm;
  330.  
  331.     tm = localtime (&t);
  332.     (void) sprintf (buf, "%02d%02d%02d%02d%02d",
  333.             tm -> tm_min, tm -> tm_hour, tm -> tm_mday,
  334.             tm -> tm_mon + 1, tm -> tm_year);
  335. }
  336.  
  337. int fax_idset (fd, ip)
  338. int    fd;
  339. Idset *ip;
  340. {
  341.     Faxcomm fc;
  342.     char    *cp;
  343.  
  344.     fc.flags = 0;
  345.     fc.command = COM_IDSET;
  346.  
  347.     if (ip -> clock[0]) {
  348.         bcopy (ip -> clock, fc.data, FAX_CLOCKLEN);
  349.         fc.len = FAX_CLOCKLEN;
  350.         cp = fc.data + FAX_CLOCKLEN;
  351.     }
  352.     else    {
  353.         fc.data[0] = 0;
  354.         cp = fc.data + 1;
  355.         fc.len = 1;
  356.     }
  357.  
  358.     if (ip -> local[0]) {
  359.         bcopy (ip -> local, cp, FAX_LOCALIDLEN);
  360.         fc.len += FAX_LOCALIDLEN;
  361.     }
  362.     else {
  363.         *cp = 0;
  364.         fc.len ++;
  365.     }
  366.  
  367.     return fax_writepacket (fd, &fc);
  368. }
  369.  
  370. fax_getstat2 (fd, sp)
  371. int    fd;
  372. Stat2    *sp;
  373. {
  374.     Faxcomm fc;
  375.     char    *cp;
  376.  
  377.     if (fax_readpacket (fd, &fc) == NOTOK)
  378.         return NOTOK;
  379.     if (fc.command != RESP_STAT2) {
  380.         advise (NULLCP, "Not a stat2 response");
  381.         return NOTOK;
  382.     }
  383.  
  384.     if (fc.data[0] == 0) {
  385.         sp -> clock[0] = 0;
  386.         cp = fc.data + 1;
  387.     }
  388.     else {
  389.         bcopy (fc.data, sp -> clock, FAX_CLOCKLEN);
  390.         cp = fc.data + FAX_CLOCKLEN;
  391.     }
  392.  
  393.     if (*cp)
  394.         bcopy (cp, sp -> local, FAX_LOCALIDLEN);
  395.     else
  396.         sp -> local[0] = 0;
  397.     return OK;
  398. }
  399.  
  400.     
  401.         
  402.